package com.ssyan.prototype.improve;


/**
 * @author ssyan
 * @Description 传统方式：
 *              优点：比较好理解，简单
 *              缺点：1）创建新的对象时，总是需要重新获取原始对象的属性，如果创建的对象比较复杂时，效率较低
 *                  2）总是需要重新初始化对象，而不是动态地获得对象运行时的状态，不够灵活
 *                  3）改进的思路分析
 * @create 2021/8/28 1:09
 * @Version 1.0
 */
public class Client {

    public static void main(String[] args) {
        Sheep sheep = new Sheep("tom", 1, "白色");

        sheep.setFriend(new Sheep("jack",2,"黑色"));
        Sheep sheep2 = sheep.clone();
        Sheep sheep3 = sheep.clone();
        Sheep sheep4 = sheep.clone();
        Sheep sheep5 = sheep.clone();

        //浅拷贝：
        //基本类型 值传递，引用类型 引用传递(缺点：指向同一个实例，一改多变）
        //深拷贝：
        //1）复制对象的所有基本数据类型的成员变量值
        //2）为所有引用数据类型的成员变量申请存储空间，并复制每个引用数据类型的成员变量所引用的值，直到该对象可达的所有对象
        System.out.println("sheep="+sheep+" sheep.friend="+sheep.getFriend().hashCode());
        System.out.println("sheep2="+sheep2+" sheep2.friend="+sheep2.getFriend().hashCode());
        System.out.println("sheep3="+sheep3+" sheep3.friend="+sheep3.getFriend().hashCode());
        System.out.println("sheep4="+sheep4+" sheep4.friend="+sheep4.getFriend().hashCode());
        System.out.println("sheep5="+sheep5+" sheep5.friend="+sheep5.getFriend().hashCode());
    }
}
